﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OpenSource.UPnP;
using System.Xml;
using System.Windows.Markup;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Threading;
using System.Runtime.CompilerServices;
using System.Collections;


namespace DispositifAffichage
{


    /**
 * \file          MainWindow.xaml.cs
 * \author        sbai
 * \brief         Interaction logic pour MainWindow.xaml.
 *
 * \details       Cette classe définit les méthodes de l'interface graphique utilisateur "MainWindow.xaml".
 */


    public partial class MainWindow : Window
    {


        public MainWindow()
        {
            InitializeComponent();
            l = new DispositifAffichage.ServeurDispositifAffichage(this);
        }

        DispositifAffichage.ServeurDispositifAffichage l;


        //DispositifAffichage.ClientDispositifAffichage client2;


        // Window x = null;


        //static ArrayList _zonesException = new ArrayList();

        /**
        * \brief      Contient les exceptions détectées lors de la génération de l'interface graphique.
        * \details    ArrayList qui contients le nom du composant qui a déclenché l'exception, son type, le nom de l'évènement, la méthode à invoquer côté client.
     */
       
       

       
       
       
        public void recupereResultat1(string component, string propriete, string valeur, GenerateInterface2 yy)
        {

            Console.WriteLine("la methode recupereResultat est appelée ???????????????????????????????");
            Console.WriteLine("la propriétééééééééééé esttt " + propriete + " la propriétééééééééééé esttt");

            Console.WriteLine("le component esttt " + component + " le component esttt");

        

            Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate()
            {

           

            if (yy.X == null) { Console.WriteLine("NULLLLLLLLLLLLLLLLLLLLLLLLL"); }

            var element = yy.X.FindName(component);

            if (element != null) { Console.WriteLine("j'ai trouvé l'element wééééééééééééééééééééééééééééééé"); }

           
            PropertyInfo[] list5;


            if (propriete.Contains(" "))
            {
                propriete = propriete.Trim();
            }

            if (element != null)
            {
               Console.WriteLine("trueeeeeeeeeeeeeeeeeeeeeee");

                if (element.GetType() == typeof(Image))
                {

                    Console.WriteLine("Ouiiiiiiiiii c'est une imaaaaaaaaaaaaaaageeeeeeeeeeeeeeeeee");

                    Image im11 = (Image)element;


                    Binding tmpBinding = new Binding();
                    string d = valeur;
                    tmpBinding.Source = new Uri(@d, UriKind.Absolute);

                    im11.SetBinding(Image.SourceProperty, tmpBinding);
                }


                else
                {
                    Console.WriteLine("Nonnnnnnnnnnn ce n'est pas une imaaaaaaaaaaaaaaageeeeeeeeeeeeeeeeee");
                    list5 = element.GetType().GetProperties();

                    Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

                    for (int f = 0; f < list5.Length; f++)
                    {
                        string propertyy = list5[f].Name;

                        if (propertyy == propriete)
                        {
                            Console.WriteLine(propertyy);

                            var prop = element.GetType().GetProperty(propertyy).GetValue(element, null);

                            Console.WriteLine("PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR " + prop);

                            try
                            {
                                element.GetType().GetProperty(propertyy).SetValue(element, valeur, null);
                            }


                            catch (ArgumentException ex)
                            {
                                Console.WriteLine("Exception:");
                                Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                                Console.WriteLine();
                                Console.WriteLine("Message d'erreur : " + ex.Message);

                                Console.WriteLine();
                                Console.WriteLine("Type de l'exception : " + ex.GetType());
                                try
                                {
                                    int val = int.Parse(valeur);

                                    Console.WriteLine("valllllllllllllllllllllllll   :   " + val);
                                    element.GetType().GetProperty(propertyy).SetValue(element, val, null);
                                }
                                catch (ArgumentException ex1)
                                {
                                    Console.WriteLine("Exception:");
                                    Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                                    Console.WriteLine();
                                    Console.WriteLine("Message d'erreur : " + ex1.Message);

                                    Console.WriteLine();
                                    Console.WriteLine("Type de l'exception : " + ex1.GetType());



                                }

                            }
                            catch (Exception ex)
                            {

                                Console.WriteLine("Exception:");
                                Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                                Console.WriteLine();
                                Console.WriteLine("Message d'erreur : " + ex.Message);

                                Console.WriteLine();
                                Console.WriteLine("Type de l'exception : " + ex.GetType());
                            }




                        }

                    }

                    Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

                }
            }


            else
            {

                Console.WriteLine("falseeeeeeeeeeeeeeeeee");
            }


            });
        //}
        }
        
        /**
        * \ButtonCloseClicked      méthode pour arrêter le device UPnP.
        * \param    sender         Le déclencheur de l'évènement.
        * \param    e              l'évènement icic est un Click sur le button.
        
        */
         
    
      private void ButtonCloseClicked(object sender, RoutedEventArgs e)
        {
            l.stopUPnP();

        }


        /**
        * \button3_Click           méthode pour démarrer le device UPnP.
        * \param    sender         Le déclencheur de l'évènement.
        * \param    e              l'évènement ici est un Click sur le button.
        
        */
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            l.startUPnP();
            RefreshMessage("le Device 'DispositifAffichage1' est connecté");

        }


        /**
       * \button1_Click           méthode pour fermer l'interface MainWindow.
       * \param    sender         Le déclencheur de l'évènement.
       * \param    e              l'évènement icic est un Click sur le button.
        
       */
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            l.stopUPnP();
            this.Close();
        }

        private void RefreshMessage(string message)
        {
            Mes.Text = message;
            Mes.Refresh();
        }

       

        public void updateinterface(string v, string nom)
        {
                       
             Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate()
            {
               
                
                GenerateInterface2 p = new GenerateInterface2(v, nom, this);

                p.chargement_UI();
          
            });

        }


    }


    public static class ExtensionMethods
    {
        private static Action EmptyDelegate = delegate() { };

        public static void Refresh(this UIElement uiElement)
        {
            uiElement.Dispatcher.Invoke(EmptyDelegate, System.Windows.Threading.DispatcherPriority.Render);
        }
    }

}







